package model

import (
	"dev.ixmxm.top/rms/utils/log"
)

//系统设置
type SystemConfig struct {
	Id             int            `json:"-" bson:"id"`                              //id
	IsSoftStop     bool           `json:"-" bson:"is_softstop"`                     //是否急停
	LogCfg         LogCfg         `json:"log_cfg" bson:"log_cfg"`                   //日志配置
	RobotOnlineCfg RobotOnlineCfg `json:"robot_online_cfg" bson:"robot_online_cfg"` //小车自动上线配置
	TrafficCfg     TrafficCfg     `json:"traffic_cfg" bson:"traffic_cfg"`           //交管配置
	MiddlewareCfg  MiddlewareCfg  `json:"middleware_cfg" bson:"middleware_cfg"`     //中间件配置
}

//日志配置
type LogCfg struct {
	LogLevel            log.Level `bson:"log_level" json:"log_level"`                           //控制台日志打印等级-1,0,1,2,3,4,5，默认：0
	LogDbLevel          log.Level `bson:"log_db_level" json:"log_db_level"`                     //数据库日志打印等级-1,0,1,2,3,4,5，默认：1
	LogMaxAge           int       `bson:"log_max_age" json:"log_max_age"`                       //文件日志最大存放天数，默认：2
	AutoCleanDbInterval int       `bson:"auto_clean_db_interval" json:"auto_clean_db_interval"` //自动清理数据库日志时间，单位：天，0为不清理，默认：2
}

//小车自动上线配置
type RobotOnlineCfg struct {
	LineOffsetLength  int `json:"line_offset_length" bson:"line_offset_length"`     //直线上可接受偏移长度：默认20cm
	LineOffsetAngle   int `json:"line_offset_angle" bson:"line_offset_angle"`       //直线上可接受偏移角度：默认9
	LineOffsetSiteDis int `json:"line_offset_site_dis" bson:"line_offset_site_dis"` //直线上可接受与到达点的距离：默认15m
}

//交管配置
type TrafficCfg struct {
	StandbyTime       int          `json:"standby_time" bson:"standby_time"`                 //生成待命任务时间间隔：单位秒，默认:15秒
	UseReroute        bool         `bson:"use_reroute" json:"use_reroute"`                   //交管-启用换路功能，默认:true
	RerouteCfg        RerouteCfg   `bson:"reroute_cfg" json:"reroute_cfg"`                   //交管-换路功能配置
	UseTaskAvoid      bool         `bson:"use_task_avoid" json:"use_task_avoid"`             //交管-启用任务避让功能，默认:false
	TaskAvoidCfg      TaskAvoidCfg `bson:"task_avoid_cfg" json:"task_avoid_cfg"`             //交管-任务避让功能配置
	UseIdleAvoid      bool         `bson:"use_idle_avoid" json:"use_idle_avoid"`             //交管-启用空闲避让功能，默认:false
	IdleAvoidCfg      IdleAvoidCfg `bson:"idle_avoid_cfg" json:"idle_avoid_cfg"`             //交管-空闲避让功能配置
	UseAvoidOtherAgvs bool         `bson:"use_avoid_other_agvs" json:"use_avoid_other_agvs"` //交管-其它-绕开其他agv，默认:false
	UsePathMutex      bool         `bson:"use_path_mutex" json:"use_path_mutex"`             //交管-其它-使用路线对冲，默认:false
	PathMutexMapNames []string     `bson:"path_mutex_map_names" json:"path_mutex_map_names"` //交管-其它-路线对冲可用地图数据集合
}

//交管-换路功能配置
type RerouteCfg struct {
	WaitTime            float64 `bson:"wait_time" json:"wait_time"`                           //交管-换路-等待时间，单位秒，默认：30
	CostSwitchTime      float64 `bson:"cost_switch_time" json:"cost_switch_time"`             //交管-换路-切换时间，单位秒，默认：30
	LowCostSwitchSlope  float64 `bson:"low_cost_switch_slope" json:"low_cost_switch_slope"`   //交管-换路-低代价值切换时间增长斜率，默认：0.5
	HighCostSwitchSlope float64 `bson:"high_cost_switch_slope" json:"high_cost_switch_slope"` //交管-换路-高代价值切换时间增长斜率，默认：50
	SiteHotCostSlope    float64 `bson:"site_hot_cost_slope" json:"site_hot_cost_slope"`       //交管-换路-点位冲突代价增长斜率，默认：0.2
}

//交管-任务避让功能配置
type TaskAvoidCfg struct {
	UseSiteStatus        bool    `bson:"use_site_status" json:"use_site_status"`                 //交管-任务避让-启用货位状态访问，默认：false
	NoIntoFullSite       bool    `bson:"no_into_full_site" json:"no_into_full_site"`             //交管-任务避让-禁止驶入有货站点，默认：true
	CheckAvoidSiteNumber int     `bson:"check_avoid_site_number" json:"check_avoid_site_number"` //交管-任务避让-检测避让点个数(NearSearch)，默认：5
	NearCalculateNumber  int     `bson:"near_calculate_number" json:"near_calculate_number"`     //交管-任务避让-车体点附近膨胀计算次数(NearNode)，默认：10
	AvoidTriggerTime     float64 `bson:"avoid_trigger_time" json:"avoid_trigger_time"`           //交管-任务避让-避让触发周期，单位秒，默认：20
	WaitIdleAgvTime      float64 `bson:"wait_idle_agv_time" json:"wait_idle_agv_time"`           //交管-任务避让-等待空闲AGV周期，单位秒，默认：60
}

//交管-空闲避让功能配置
type IdleAvoidCfg struct {
	AvoidSearchDistance float64 `bson:"avoid_search_distance" json:"avoid_search_distance"` //交管-空闲避让-避让搜索距离，单位米，默认：60
}

//中间件配置
type MiddlewareCfg struct {
	Ip            string `json:"ip" bson:"ip"`                         //IP地址，默认:127.0.0.1
	PortApi       int32  `json:"port_api" bson:"port_api"`             //API端口号，默认：8091
	PortWebsocket int32  `json:"port_websocket" bson:"port_websocket"` //Websocket设备端口号，默认：9091
}

func (SystemConfig) TableName() string {
	return "t_system_config"
}

//-------------------------定时充电相关--------------------
// type ChargerTimerCfg struct {
// 	RuleList []DayChargerRule `json:"rule_list" bson:"rule_list"` //日充电规则
// }

//AGV主类型类别
type DayModeType uint8

const (
	WeekDayModeAll       DayModeType = 0 //所有天的都按照这个标准来
	WeekDayModeMonday    DayModeType = 1 //星期一按照这个标准
	WeekDayModeTuesday   DayModeType = 2 //星期二按照这个标准
	WeekDayModeWednesday DayModeType = 3 //星期三按照这个标准
	WeekDayModeThursday  DayModeType = 4 //星期四按照这个标准
	WeekDayModeFriday    DayModeType = 5 //星期五按照这个标准
	WeekDayModeSaturday  DayModeType = 6 //星期六按照这个标准
	WeekDayModeSunDay    DayModeType = 7 //星期日按照这个标准
)

type DayChargerRule struct {
	Id        uint16 `json:"id" bson:"id"`                 //规则编号
	StartTime string `json:"start_time" bson:"start_time"` //开始充电时间时间
	EndTime   string `json:"end_time" bson:"end_time"`     //结束充电时间
	// IsCrossDay    uint8       `json:"is_cross_day" bson:"is_cross_day"`                        //是否跨天 0：不跨天 1：跨天
	RobotIdList   []string    `json:"robot_id_list" bson:"robot_id_list"`                      //按照规则的机器人列表
	WeekDayMode   DayModeType `json:"week_day_mode" bson:"week_day_mode"`                      //每周日充电格式
	ChargePercent int         `json:"charge_percent" bson:"charge_percent" binding:"required"` //充电阀值%
	IsEnable      int         `json:"is_enable" bson:"is_enable" `                             //0:启用 1：禁用
}

func (DayChargerRule) TableName() string {
	return "t_charger_timer_config"
}

//可以延伸每台车的规则
type RobotDayChargerRule struct {
	AgvId              string           `json:"agv_id`
	DayChargerRuleList []DayChargerRule `json:"day_charger_rule_list`
}
